%{
/* 
=====================================================
   Especificacao Flex do Analisador Lexico 
        para o Pascal Simplificado-Tomasz
-----------------------------------------------------
Autores:
	Andre Paulo Machado
	Elisangela de Assis da Silva
	Roberto Avelino da Silva
-----------------------------------------------------
Data: 13/03/2008
=====================================================
*/

#include "y.tab.h"
#include <string.h>

%}


%{
/* Macros para eliminar comentarios  */
%}

%x coment_bloco		
%x coment_bloco2	
%x coment_linha		


%%


%{
/* Brancos e comentarios */
%}

[ \t\n]		;

"(*" BEGIN( coment_bloco ); /* Comentarios em bloco do tipo '(* ... *)' */
<coment_bloco>[^*\n]*		/* Ignora tudo que nao for um '*' */
<coment_bloco>"*"+[^*)\n]*	/* Ignora '*'s que nao sao seguidos por um ')' */
<coment_bloco>"*"+")"		BEGIN( INITIAL );

"{" BEGIN( coment_bloco2 );	/* Comentarios em bloco do tipo '{ ... }' */
<coment_bloco2>[^}\n]*		/* Ignora tudo que nao for um '}' */
<coment_bloco2>"}"			BEGIN( INITIAL );

"//" BEGIN( coment_linha );	/* Comentarios em linha do tipo '// ...' */
<coment_linha>[^\n]*		/* Igora tudo que nao for um '\n' */
<coment_linha>"\n"			BEGIN( INITIAL );


%{
/* Palavras reservadas */
%}

program 	{ return tPROGRAM; }
var		{ return tVAR; }
begin		{ return tBEGIN; }
end		{ return tEND; }
div		{ return tDIV; }
while		{ return tWHILE; }
do		{ return tDO; }
repeat		{ return tREPEAT; }
until		{ return tUNTIL; }
or		{ return tOR; }
and		{ return tAND; }
not		{ return tNOT; }
read		{ return tREAD; }
write		{ return tWRITE; }
procedure 	{ return tPROCEDURE; }
function 	{ return tFUNCTION; }
label		{ return tLABEL; }
goto		{ return tGOTO; }
if		{ return tIF; }
then		{ return tTHEN; }
else		{ return tELSE; }
true		{ return tTRUE; }
false		{ return tFALSE; }
integer		{ return tINTEGER; }
boolean		{ return tBOOLEAN; }


%{
/* Simbolos */
%}

"("	{ return tABRE_PARENTESE; }
")"	{ return tFECHA_PARENTESE; }
"."	{ return tPONTO; }
";"	{ return tPONTO_E_VIRGULA; }
","	{ return tVIRGULA; }
":"	{ return tDOIS_PONTOS; }
":="	{ return tATRIBUI; }
"+"	{ return tMAIS; }
"-"	{ return tMENOS; }
"*"	{ return tMULTIPLICA; }
"="	{ return tIGUAL; }
"<>"	{ return tDIFERENTE; }
"<"	{ return tMENOR; }
"<="	{ return tMENOR_OU_IGUAL; }
">="	{ return tMAIOR_OU_IGUAL; }
">"	{ return tMAIOR; }


%{
/* Identificadores e numeros */
%}

[a-zA-Z][a-zA-Z0-9]* 	{ yylval.idToken = strdup( yytext ); return tIDENTIFICADOR; }  
						
[0-9]+		{ yylval.numToken = atoi( yytext ); return tNUMERO; }

%%
